package suda.entity;

import cn.afterturn.easypoi.excel.annotation.*;
import lombok.Data;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

/*
    @ExcelTarget
        - 用在实体类上标识是一个可以通过EasyPOI导入导出的实体类
        - 相关属性
            value: [String][定义id唯一标识,不能重复]
            height: [Double][定义单元格高度]
            fontSize: [short ][定义单元格字体大小]

    @Excel
        - 用在filed(属性)上面,是对Excel一列的一个描述
        - 常用属性
            name: [String][生成Excel表格中列名]
            needMerge: [boolean][是否需要纵向合并单元格(用于含有list中,单个的单元格,合并list创建的多个row)]
            orderNum: [String][指定生成Excel中列的顺序,按照数字自然顺序排序]
            savePath: [String][指定导入Excel中图片的保存路径]
            type: [String][导出类型 1 是文本 2 是图片,3 是函数,10 是数字 默认是文本]
            width: [Double][指定导出Excel时列的宽度]
            isImportField: [boolean][是否是导入字段,如果没有说明是错误的Excel]
            exportFormat: [String][导出Excel的时间格式]
            importFormat: [String][导入Excel的时间格式]
            format: [String][相当于同时设置了exportFormat和importFormat]
            imageType: [int][导出类型 1 从file读取 2 是从数据库中读取 默认是文件 同样导入也是一样的]
            suffix: [String][文字后缀,如 90 变成 90%]

    @ExcelEntity
        - 表示一个继续深入导出的实体,但它没有太多的实际意义,只是告诉系统这个对象里面同样有导出的字段
        - 常用属性
	        name: [String][定义唯一标识]

    @ExcelCollection
        - 一对多的集合注解,用以标记集合是否被数据以及集合的整体排序
        - 常用属性:
            name: [String][定义集合列名]
            orderNum: [int][用来指定导出excel集合内列的顺序]
            type: [Class\<?>][用来指定导出是创建对象类型]

    @ExcelIgnore 和名字一样表示这个字段被忽略跳过这个导出
 */
@Data
@ExcelTarget("users")
public class User implements Serializable { //导出Excel的对象必须实现对象序列化接口

//    @Excel(name = "编号",orderNum = "0")
    @ExcelIgnore
    private String id;

    @Excel(name = "姓名",orderNum = "1")
    private String name;

    @Excel(name = "年龄",orderNum = "3",suffix = "岁")
    private Integer age;

    @Excel(name = "生日",width = 15.0,format = "yyyy-MM",orderNum = "2")
    private Date bir;

    @Excel(name = "状态",orderNum = "4",replace = {"激活_1","锁定_0"})
    private String status;

    //当导出List集合时,如果使用该注解,导出的格式为toString形式,不美观,所以需要自定义格式
    //@Excel(name = "爱好",width = 20.0,orderNum = "5")
    @ExcelIgnore
    private List<String> hobby;

    //自定义爱好的字符串,通过其对应的get方法设置其格式
    @Excel(name = "爱好",width = 20.0,orderNum = "5")
    private String hobbyStr;

    public String getHobbyStr() {
        StringBuilder sb = new StringBuilder();
        this.hobby.forEach(e -> {
            sb.append(e).append("、");
        });
        return sb.toString();
    }

    @ExcelEntity //当对象中含有另外一个对象时,使用此注解标志一对一的对应关系
    private Card card;

    @ExcelCollection(name = "订单列表",orderNum = "8") //一对多关系时,使用此注解
    private List<Order> orders;

    @Excel(name = "头像信息",orderNum = "0",width = 20,type = 2) //type必须设置为2,才认为其是图片类型
    private String photo;
}
